// MatricesLib.h
// Matrix Static Library

#include <iostream>
#include <stdexcept>
#include <cmath>


namespace Matrices
{

	class MyMatrices
    {
	
    public:

		/////////////////////////////////
		//----- MatricesBasis.cpp -----//
		/////////////////////////////////

		// Constructor
		MyMatrices();
		MyMatrices(float m00, float m01, float m02, float m03,
               float m10, float m11, float m12, float m13,
               float m20, float m21, float m22, float m23,
               float m30, float m31, float m32, float m33);
		MyMatrices(float *elements);

		// Read Matrices from the input
        static void ReadMatrix();

		// Multiply Matrices
        static float (*MultiplyMatrix(float **matrix1, float **matrix2));

		// Transpose Matrix
		static float (*TransposeMatrix(float **matrix1));

		// Inverse Matrix
		static int GetMinor(float **src, float **dest, int row, int col, int order);
		static float CalculateDeterminant(float **mat, int order);
		static float (*InverseMatrix(float **matrix1));

		// Access rows or columns as vectors
		static float *AccessMatrix(int vr, int vc, float **matrix1);

		//////////////////////////////////////////
		//----- MatricesTransformation.cpp -----//
		//////////////////////////////////////////

		// Translate Matrix
		static float (*TranslateMatrix(float tx, float ty, float tz));

		// Scale Matrix
		static float (*ScaleMatrix(float sx, float sy, float sz));

		// Rotate Matrix
		static float (*RotateMatrix(int xyz, float angle));

		// Shear Matrix
		static float (*ShearMatrix(int xyz, float angle));

	};
}
